"""
删除指定目录下的空子目录工具

该脚本用于递归删除指定父目录下所有空的直接子目录（仅一级子目录）。
使用Click处理命令行参数，Loguru进行日志记录，采用函数式编程风格实现。

示例:
    python remove_empty_dirs.py --path /path/to/parent_dir --dry-run
"""

from pathlib import Path
from typing import List, Tuple, Generator, Optional
import click
from loguru import logger

# 配置Loguru日志格式
logger.remove()  # 移除默认配置
logger.add(
    sink=lambda msg: print(msg, end=""),
    format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{message}</cyan>",
    level="INFO",
    colorize=True,
)


def validate_directory(path: str) -> Path:
    """
    验证并返回有效的Path对象

    Args:
        path: 目录路径字符串

    Returns:
        Path: 有效的Path对象

    Raises:
        click.BadParameter: 当路径无效时抛出异常
    """
    dir_path = Path(path)
    if not dir_path.exists():
        raise click.BadParameter(f"路径不存在: {path}")
    if not dir_path.is_dir():
        raise click.BadParameter(f"不是目录: {path}")
    return dir_path


def scan_direct_subdirs(parent_dir: Path) -> Generator[Path, None, None]:
    """
    扫描父目录的直接子目录

    Args:
        parent_dir: 父目录Path对象

    Yields:
        Path: 每个直接子目录的Path对象
    """
    for item in parent_dir.iterdir():
        logger.info("-----------------------------------")
        logger.info(item.name)
        if item.is_dir():
            yield item


def is_directory_empty(dir_path: Path) -> bool:
    """
    检查目录是否为空

    Args:
        dir_path: 待检查目录的Path对象

    Returns:
        bool: 目录是否为空
    """
    try:
        return next(dir_path.iterdir(), None) is None  # 尝试获取第一个条目
    except PermissionError:
        logger.warning(f"无权限访问目录: {dir_path}")
        return False
    except Exception as e:
        logger.error(f"检查目录出错: {dir_path} - {str(e)}")
        return False


def remove_empty_dir(dir_path: Path, dry_run: bool) -> Tuple[bool, str]:
    """
    删除空目录或模拟删除

    Args:
        dir_path: 待删除目录的Path对象
        dry_run: 是否模拟运行（不实际删除）

    Returns:
        Tuple[bool, str]: (操作结果, 描述信息)
    """
    try:
        if dry_run:
            return True, f"[模拟] 将删除空目录: {dir_path}"

        dir_path.rmdir()
        return True, f"已删除空目录: {dir_path}"

    except OSError as e:
        error_msg = f"删除目录失败: {dir_path} - {str(e)}"
        return False, error_msg
    except Exception as e:
        error_msg = f"未知错误: {dir_path} - {str(e)}"
        return False, error_msg


def process_parent_directory(parent_dir: Path, dry_run: bool) -> Tuple[int, int]:
    """
    处理父目录下的所有空子目录

    Args:
        parent_dir: 父目录Path对象
        dry_run: 是否模拟运行

    Returns:
        Tuple[int, int]: (成功数量, 失败数量)
    """
    success_count = 0
    failure_count = 0

    for subdir in scan_direct_subdirs(parent_dir):
        if is_directory_empty(subdir):
            status, message = remove_empty_dir(subdir, dry_run)
            if status:
                logger.success(message)
                success_count += 1
            else:
                logger.error(message)
                failure_count += 1
        else:
            logger.debug(f"跳过非空目录: {subdir}")

    return success_count, failure_count


@click.command()
@click.option(
    "--path",
    type=click.Path(exists=False),
    required=True,
    help="要清理的父目录路径",
)
@click.option(
    "--dry-run",
    is_flag=True,
    help="模拟运行（显示将要删除的目录但不实际执行）",
)
def main(path: str, dry_run: bool) -> None:
    """
    主函数：删除指定目录下的空子目录

    Args:
        path: 目标目录路径
        dry_run: 模拟运行标志
    """
    try:
        parent_dir = validate_directory(path)
        logger.info(f"开始处理目录: {parent_dir.resolve()}")

        if dry_run:
            logger.warning("!!! 模拟运行模式（不会实际删除目录） !!!")

        success, failure = process_parent_directory(parent_dir, dry_run)
        logger.info("-----------------------------------")
        logger.success(f"操作完成 | 成功: {success}, 失败: {failure}")
        if dry_run:
            logger.info("注意：本次为模拟运行，未执行实际删除操作")

    except click.BadParameter as e:
        logger.error(f"参数错误: {str(e)}")
        exit(1)
    except Exception as e:
        logger.critical(f"程序异常: {str(e)}")
        exit(2)


"""
# 实际删除空目录
python remove_empty_dirs.py --path E:/emby/twitter/users/电脑查看

# 模拟运行（显示将要删除的目录）
python remove_empty_dirs.py --path E:/emby/twitter/users/我的相册 --dry-run

"""
if __name__ == "__main__":
    main()
